/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package grafika;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.net.URL;
import javax.swing.*;
import logika.Hra;

/**
 *
 * @author xkovt09
 */
public class GUI {

    private JFrame okno;
    private JMenuBar menu;
    private JMenu hraMenu, napovedaMenu;
    private JMenuItem newGame, log, konec, napoveda, oHre;
    private JPanel centralniPanel, dolniPanel, mapaPanel, levyPanel;
    public JTextArea vystup;
    private JLabel popisek;
    private JTextField vstupniRadek;
    private Hra hra;
    private PanelVychodu panelVychodu;
    private PanelVeci panelVeci;
    private PanelBatoh batohOkno;
    private WastelandMap mapa;
    private PanelPostav panelPostav;

    public GUI() {
        //Použité barvy
        Color text = new Color(19, 179, 83);
        Color okna = new Color(91, 97, 51);
        Color tlacitka = new Color(145, 47, 12);

        hra = new Hra();

        //Vytvoření okna...
        okno = new JFrame("Fallout");
        okno.setSize(1300, 470);
        okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        okno.setBackground(okna);

        // Vytvoření lišty menu...
        menu = new JMenuBar();
        menu.setBackground(tlacitka);

        hraMenu = new JMenu("Hra");
        hraMenu.setMnemonic(KeyEvent.VK_S);
        hraMenu.setForeground(Color.yellow);
        hraMenu.setMnemonic('H');
        menu.add(hraMenu);

        newGame = new JMenuItem("Nová hra");
        newGame.setForeground(Color.yellow);
        newGame.setBackground(tlacitka);
        newGame.setAccelerator(KeyStroke.getKeyStroke("crtl N"));
        newGame.addActionListener(new OvladacNewGame());
        hraMenu.add(newGame);
        hraMenu.addSeparator();

        log = new JMenuItem("Zobrazit log");
        log.setForeground(Color.yellow);
        log.setBackground(tlacitka);
        log.addActionListener(new OvladacLog());
        hraMenu.add(log);

        konec = new JMenuItem("Konec hry");
        konec.setBackground(tlacitka);
        konec.setForeground(Color.yellow);
        hraMenu.add(konec);

        //Napověda
        napovedaMenu = new JMenu("Nápověda");
        napovedaMenu.setMnemonic('N');
        napovedaMenu.setForeground(Color.yellow);
        menu.add(napovedaMenu);

        napoveda = new JMenuItem("Nápověda");
        URL cestaKObrazku = GUI.class.getResource("/obrazky/Help24.gif");
        if (cestaKObrazku != null) {
            napoveda.setIcon(new ImageIcon(cestaKObrazku));
        }
        oHre = new JMenuItem("O hře");
        oHre.setBackground(tlacitka);
        napoveda.setBackground(tlacitka);
        napoveda.setForeground(Color.yellow);
        oHre.setForeground(Color.yellow);
        napovedaMenu.add(napoveda);
        napovedaMenu.add(oHre);

        okno.setJMenuBar(menu);

        //Levý panel
        levyPanel = new JPanel();
        GridLayout panel = new GridLayout(2, 2, 2, 2);
        levyPanel.setLayout(panel);
        okno.add(levyPanel, BorderLayout.WEST);

        //Centrální panel...
        centralniPanel = new JPanel();
        centralniPanel.setBackground(okna);
        centralniPanel.setForeground(Color.yellow);
        okno.add(centralniPanel, BorderLayout.CENTER);

        //Východy...
        panelVychodu = new PanelVychodu(hra, this);
        panelVychodu.setBackground(Color.BLACK);
        levyPanel.add(panelVychodu);

        //Veci v místnostech...
        panelVeci = new PanelVeci(hra, this);
        panelVeci.setBackground(Color.BLACK);
        levyPanel.add(panelVeci);

        //Batoh...
        batohOkno = new PanelBatoh(hra, this);
        batohOkno.setBackground(okna);
        levyPanel.add(batohOkno);

        //Postavy
        panelPostav = new PanelPostav(hra, this);
        panelPostav.setBackground(Color.BLACK);
        levyPanel.add(panelPostav);

        //Pole pro výstup hry...
        vystup = new JTextArea(22, 50);
        vystup.setBorder(BorderFactory.createTitledBorder(null, "Dialogy", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, Color.yellow));
        vystup.setBackground(Color.black);
        vystup.setForeground(text);
        vystup.setEditable(false);
        vystup.append(hra.vratUvitani());
        vystup.append("\n");

        centralniPanel.add(new JScrollPane(vystup), BorderLayout.CENTER);

        //Mapa...
        mapaPanel = new JPanel();
        mapaPanel.setBackground(Color.BLACK);
        mapaPanel.setBorder(BorderFactory.createTitledBorder(null, "Mapa", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, Color.yellow));
        mapa = new WastelandMap(hra, this);
        mapaPanel.add(mapa);
        centralniPanel.add(mapaPanel, BorderLayout.EAST);

        //Dolni panel...
        dolniPanel = new JPanel();
        dolniPanel.setLayout(new BoxLayout(dolniPanel, BoxLayout.LINE_AXIS));
        dolniPanel.setBackground(okna);

        //Popisek vstupní řádky...
        dolniPanel.add(Box.createRigidArea(new Dimension(30, 0)));
        popisek = new JLabel("Zadej příkaz");
        popisek.setForeground(Color.yellow);
        dolniPanel.add(popisek);
        dolniPanel.add(Box.createRigidArea(new Dimension(5, 0)));

        //Vstupní řádka...
        vstupniRadek = new JTextField(25);
        vstupniRadek.setBackground(Color.BLACK);
        vstupniRadek.setForeground(text);
        dolniPanel.add(vstupniRadek);
        dolniPanel.add(Box.createRigidArea(new Dimension(30, 0)));
        okno.add(dolniPanel, BorderLayout.SOUTH);

        //Registrace panelů a mapy...
        hra.getHerniPlan().zaregistruj(panelVychodu);
        hra.getHerniPlan().zaregistruj(panelPostav);
        hra.getHerniPlan().zaregistruj(panelVeci);
        hra.getHerniPlan().zaregistruj(mapa);
        hra.getHerniPlan().upozorniMeNaZmenu();

        hra.getHerniPlan().getBatoh().zaregistruj(batohOkno);
        hra.getHerniPlan().getBatoh().upozorniMeNaZmenu();

        hra.getHerniPlan().getAktualniProstor().zaregistruj(panelVeci);
        hra.getHerniPlan().getAktualniProstor().upozorniMeNaZmenu();

        //Přiřazení ovladačů...
        vstupniRadek.addActionListener(new OvladacVstupniRadky());
        napoveda.addActionListener(new OvladacNapoveda());
        konec.addActionListener(new OvladacKonec());
        oHre.addActionListener(new OvladacOHre());


        // okno.pack();
    }

     /**
     * Metoda nastavující visibilitu celého GUI...
     *
     * @param visible je-li nastaveno na TRUE, tak se zobrazí GUI programu...
     */
    public void setVisible(boolean visible) {
        okno.setVisible(visible);
    }

    /**
     * Metoda pro zpracování zadaného příkazu...
     *
     * @param prikaz
     */
    public void provedPrikaz(String prikaz) {
        vstupniRadek.setText("");
        String textKVypsani = hra.zpracujPrikaz(prikaz);
        vystup.append("\n");
        vystup.append("> ");
        vystup.append(prikaz);
        vystup.append("\n");
        vystup.append("\n");
        vystup.append(textKVypsani);
        vystup.append("\n");
        vystup.append("\n");
        if (hra.konecHry()) {
            vystup.append(hra.vratEpilog());
            vstupniRadek.setEnabled(false);
            panelVychodu.setEnabled(false);
            panelVeci.setEnabled(false);
            panelPostav.setEnabled(false);
            batohOkno.setEnabled(false);
        }
        vystup.setCaretPosition(vystup.getDocument().getLength());
    }


    /**
     * ovaldač vstupní řádky...
     */
    private class OvladacVstupniRadky implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            String prikaz = vstupniRadek.getText();
            provedPrikaz(prikaz);
        }
    }

    /**
     * Vnitřní třída pro ovladač talčítka Nápověda...
     */
    private class OvladacNapoveda implements ActionListener {

        private JDialog help;
        private JEditorPane vystupHelp;

        /**
         * Metoda vytvoří dialogové okno a načte nápovědu ze souboru html, který je součástí programu...
         *
         *
         * @param e
         */
        @Override
        public void actionPerformed(ActionEvent e) {

            help = new JDialog();
            help.setTitle("Nápověda");
            help.setModal(false);
            help.setVisible(true);
            vystupHelp = new JEditorPane();
            vystupHelp.setEditable(false);
            help.add(new JScrollPane(vystupHelp));
            URL umisteniSouboru = GUI.class.getResource("/help/newhtml.html");
            try {
                vystupHelp.setPage(umisteniSouboru);
            } catch (IOException exception) {
                JOptionPane.showMessageDialog(null,
                        "Soubor s nápovědou nebyl nalezen",
                        "Chyba při načítání nápovědy",
                        JOptionPane.ERROR_MESSAGE);
            }
            help.setLocation(700, 200);
            help.setSize(400, 600);

        }
    }

    /**
     * Vnitřní třída pro ovladač tlačítka Kones Hry...
     */
    private class OvladacKonec implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            Object[] opt = {"Ano", "Ne"};
            int s = JOptionPane.showOptionDialog(null, "Opravud chcete ukončit hru?",
                    "Konec hry", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null,
                    opt, opt[0]);
            if (s == JOptionPane.YES_OPTION) {
                System.exit(0);
            }
        }
    }


    /**
     * Vnitřní třída pro ovladač talčítak Nová Hra
     */
    private class OvladacNewGame implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            hra = new Hra();
            panelVychodu.setHra(hra);
            panelVeci.setHra(hra);
            batohOkno.setHra(hra);
            panelPostav.setHra(hra);
            mapa.setHra(hra);
            hra.getHerniPlan().getBatoh().zaregistruj(batohOkno);
            hra.getHerniPlan().getBatoh().upozorniMeNaZmenu();
            hra.getHerniPlan().zaregistruj(mapa);
            hra.getHerniPlan().zaregistruj(panelVeci);
            hra.getHerniPlan().zaregistruj(panelVychodu);
            hra.getHerniPlan().zaregistruj(panelPostav);
            hra.getHerniPlan().upozorniMeNaZmenu();
            hra.getHerniPlan().getAktualniProstor().zaregistruj(panelVeci);
            hra.getHerniPlan().getAktualniProstor().upozorniMeNaZmenu();


            vystup.setText("");

            vystup.append(hra.vratUvitani());
            vystup.append("\n");

            vstupniRadek.setEnabled(true);
            panelVychodu.setEnabled(true);
            panelVeci.setEnabled(true);
            panelPostav.setEnabled(true);
            batohOkno.setEnabled(true);
        }
    }

    /**
     * Ovladač pro talčítko Zobrazit Log
     */
    private class OvladacLog implements ActionListener {

        private JDialog log;
        private JEditorPane logVystup;
        
        @Override
        public void actionPerformed(ActionEvent e) {
            log = new JDialog();
            log.setTitle("Log");
            log.setModal(false);
            log.setVisible(true);
            logVystup = new JEditorPane();
            logVystup.setEditable(false);
            log.add(new JScrollPane(logVystup));
            URL umisteniSouboru = GUI.class.getResource("adventura.log");
            try {
                logVystup.setPage(umisteniSouboru);
            } catch (IOException exception) {
                JOptionPane.showMessageDialog(null,
                        "Soubor s logem nebyl nalezen",
                        "Chyba při načítání logu",
                        JOptionPane.ERROR_MESSAGE);
            }
            log.setLocation(700, 200);
            log.setSize(400, 600);
        }
    }


    /**
     * Ovladač talčítka O hře
     */
    private class OvladacOHre implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
              
            JOptionPane.showMessageDialog(null,
                    "<html><body><h2>Fallout: Tenpeny's Revenge<h2>" + "<p>autor: Tomáš Na'vi Koválik</p>" + "<p>Hra na motivy známého RPG Fallout.</p>" + "<p><i>© 2011 Kovalware studio. All rights reserved.</i></p>" + "</body></html>", "O hře", JOptionPane.INFORMATION_MESSAGE);
        }
    }
}
